package ca.etsmtl.log120.tp1.shapehierarchy;

import java.awt.Graphics;

/******************************************************
Cours : LOG120
Session : E2011
Groupe : 01
Projet : Laboratoire #2
Etudiants : Nicolas Blais Miko
 	 		Yohan Trepanier-Montpetit
Codes perm. : BLAN24079109
			  TREY16079108
Professeur : Chamseddine Talhi
Charge de labo : Eric Goulet
Nom du fichier : AbstractShape.java
Date cree : 2011-05-18
Date dern. modif. 2015-05-18
*************************************************** ****
Historique des modifications
*************************************************** ****
2011-05-18 Version initiale (Nicolas Blais Miko)
***************************************************/

/**
 * Classe representant n'importe quelle forme dans un espace a deux dimensions
 * @param nseq Le numero de sequence de la forme
 * @param posX La position en X de la forme
 * @param posY La position en Y de la forme
 */
public abstract class AbstractShape implements Comparable<AbstractShape>{

	private int nseq; //Le numero de sequence de la forme
	protected int posX; //La position en X de la forme
	protected int posY; //La position en Y de la forme
	private int shapeID = 0;
	
	
	
	/**
	 * 
	 * CONSTRUCTEURS
	 * 
	 */
	
	/**
	 * Constructeur par defaut
	 */
	public AbstractShape(){}
	
	/**
	 * Constructeur parametrique
	 * @param nseq Le numero de sequence de la forme
	 * @param posX La position en X de la forme
	 * @param posY La position en Y de la forme
	 */
	public AbstractShape(int nseq, int posX, int posY, int shapeID){
		
		this.shapeID = shapeID;
		this.nseq = nseq;
		this.posX = posX;
		this.posY = posY;
	}
	
	/**
	 * Constructeur par copie d'objet
	 * @param shape La forme a contruire
	 */
	public AbstractShape(AbstractShape shape){
		
		this.nseq = shape.nseq;
		this.posX = shape.posX;
		this.posY = shape.posY;
	}
	
	/**
	 * 
	 * ACCESSEURS
	 * 
	 */
	
	/**
	 * Retourne le numero de sequence de la forme
	 */
	public int getNseq(){
		
		return nseq;
	}
	
	public int getShapeId(){
		return shapeID ;
	}
	
	/**
	 * Retourne la position en X de la forme
	 */
	public int getPosX(){
		
		return posX;
	}
	
	/**
	 * Retourne la position en Y de a forme
	 */
	public int getPosY(){
		
		return posY;
	}
	
	/**
	 * 
	 * COMPORTEMENTS
	 * 
	 * 
	 */
	
	/**
	 * Methode abstraite pour changer la position de la forme a l'ecran, cette methode doit etre implementee par les enfant de AbstractShape
	 */
	public abstract void setPosition(int x, int y);
	
	/**
	 * Methode qui retourne les informations sur la forme en format "String"
	 */
	public String toString(){
		
		return "Numero de sequence: " + nseq + ", " + "position: " + "(" + posX + "," + posY +") "; 
	}
	
	/**
	 * Methode qui retourne si la forme recue en parametre est egale a la forme qui fait l'appel
	 * @param shape La forme avec laquelle on compare
	 * @return Vrai si les deux formes sont identiques, faux sinon
	 */
	public boolean equals(Object obj){
		AbstractShape shape = (AbstractShape)obj;
		return nseq == shape.nseq && posX == shape.posX && posY == shape.posY;
	}
	
	/**
	 * Methode qui compare deux formes selon leur numero de sequence 
	 * @return 1 si la forme qui appel a un plus grand numero de sequence, 0 si les deux numeros sont egaux
	 * 			et -1 si la forme qui appel a un plus petit numero de sequence 
	 */
	@Override
	public int compareTo(AbstractShape shape) {

		if(nseq > shape.getNseq())
			return 1;
		else if(nseq == shape.getNseq())
			return 0;
		else if(nseq < shape.getNseq())
			return -1;
		
		return 0;
	}
	
	/**
	 * Methode pour dessiner une forme, peut-importe son type
	 * @param g l'objet graphics avec lequel on dessine
	 */
	public abstract void drawShape(Graphics g);
	
	/**
	 * Methode abstraite pour calculer l'aire de n'importe quelle forme
	 * @return
	 */
	public abstract double getAire();
	
	/**
	 * Methode abstraite pour connaitre la hauteur de n'importe quelle forme 
	 * @return
	 */
	public abstract int getHauteur();
	
	/**
	 * Methode abstraite pour connaitre la largeur de n'importe quelle forme
	 * @return
	 */
	public abstract int getLargeur();
	
	/**
	 * Methode abstraite pour connaitre la distance entre les deux points les plus eloignes d'une forme peu importe son type
	 * @return
	 */
	public abstract double getDistance();
	
	/**
	 * Methode qui retourne un copie de la forme
	 * @return
	 */
	public abstract AbstractShape copyOf();
}
